package com.mrx.mxshell

import com.mrx.mxshell.ParamStatus.*
import java.io.Serializable

/**
 * 命令对象类
 * @param cmd Cmd 命令对象
 * @param params String? 这条命令的参数
 */
class Command(private val cmd: Cmd, private val params: Array<String>) : Serializable {
    init {
        // 判断命令是否需要参数
        when (cmd.getParamStatus()) {
            YES_ONLY_ONE -> {
                // 如果此条命令包含参数, 但参数未给出 那就抛出异常
                if (params.isEmpty()) throw IllegalArgumentException("参数过少！")
            }
            NO_DO_NOT_GIVE -> {
                // 如果此条命令不包含参数, 但又给出了参数 那就抛出异常
                if (params.isNotEmpty()) throw IllegalArgumentException("参数过多！")
            }
            YES_TWO_PARAM -> {
                // 参数只能有两个
                if (params.size < 2) {
                    throw IllegalArgumentException("参数过少！")
                } else if (params.size > 2) {
                    throw IllegalArgumentException("参数过多！")
                }
            }
            MAYBE_ONE_PARAM -> {
                if (params.size > 1) throw IllegalArgumentException("参数过多！")
            }
            MAYBE_TWO_PARAM -> {
                if (params.size > 2) throw IllegalArgumentException("参数过多！")
            }
        }
    }

    /**
     * 代理执行 cmd 对象的 doStuff
     */
    fun doStuff() {
        val cmdParamStatus = cmd.getParamStatus()
        if (cmdParamStatus == YES_TWO_PARAM || cmdParamStatus == MAYBE_TWO_PARAM) {
            cmd.doStuff(params)
        } else {
            if (params.isEmpty()) {
                cmd.doStuff(null)
            } else {
                cmd.doStuff(params[0])
            }
        }
    }
}